这个边界条件太多了。。。
1。一个是要考虑到INT_MAX和INT_MIN的情况,然后要想到INT_MIN是比INT_MAX的绝对值大的,所以不能够简单的,一碰到n<0,就算-n的情况。
然后还要考虑到n<0的情况下,用1去除,要保证除数不是0
还有1的几次方之类的,可以直接输出
还有一个很重要的点,就是考虑到x<0的时候,注意符号的问题
Implementpow(x,n), which calculates x_raised to the power_n(xn).
Example 1:
Input:
2.00000, 10
Output:
1024.00000
Example 2:
Input:
2.10000, 3
Output:
9.26100
Example 3:
Input:
2.00000, -2
Output:
0.25000
Explanation:
2
-2
= 1/2
2
= 1/4 = 0.25
Note:
- -100.0 < x < 100.0 n is a 32-bit signed integer, within the range [−231, 231 − 1]
class Solution {
public:
double myPow\(double x, int n\) {
if\(\(n==0\)\|\|\(x==1\)\) return 1;
if\(n==1\) return x;
int flag=1;
if \(x<0\) {
flag=\(n%2\)?-1:1;
x=-x;
// cout<<flag;
}
if \(n<0\) {
if \(n==INT\_MIN\){
if \(x>1\) return 0;
if \(x<1\) return INT\_MAX;
if \(x==1\) return flag;
}
if \(myPow\(x,-n\)==0\) {
return INT\_MAX;
}
else{
return 1/myPow\(x,-n\);
}
}
int i=1;
double result=x;
double past=0;
while \(i<n\){
past=result;
if\(2\*i<=n\){
result=result\*result;
i\*=2;
}
else{
result=result\*x;
i++;
}
if\(result==past\) break;
}
return result\*flag;
}
};
但是我这个版本的效率太低了
参考版本:
static int x = [](){
std::ios::sync\_with\_stdio\(false\);
cin.tie\(NULL\);
return 0;
}();
class Solution {
public:
double myPow\(double x, int n\) {
if \(n == 0 \|\| x == 1\) return 1;
double t = myPow\(x, n / 2\);
if \(n % 2\)
return n < 0 ? 1.0 / x \* t \* t : x \* t \* t;
else
return t \* t;
}
};
最开始的时候,是用递归的方式写的。但是有run time error,就以为不能用递归。。。